#include "fila_dina.h"

struct no {
    int info;
    struct no *prox;
};

struct fila {
    struct no *ini;
    struct no *fim;
};

Fila cria_fila()
{
    Fila f;
    f = (Fila) malloc(sizeof(struct fila));
    if(f != NULL)
    {
        f->ini = NULL;
        f->fim = NULL;
    }
    return f;
}

int fila_vazia(Fila f)
{
    if(f->ini == NULL)
        return 1;
    return 0;
}

int insere_final(Fila f, int elem)
{
    struct no *N;
    N = (struct no *) malloc(sizeof(struct no));
    if(N == NULL)
        return 0;

    N->info = elem; /* Preenche campo no */
    N->prox = NULL; /* Preenche campo prox */
    if(fila_vazia(f))
        f->ini = N; /* Se fila vazia */
    else
        (f->fim)->prox = N; /* Se fila com elementos (Não vazia) */
    f->fim = N; /* Campo fim aponta para N */
    return 1;
}

int remove_inicio(Fila f, int *elem)
{
    if(fila_vazia(f))
        return 1;
    struct no *aux = f->ini; /* Aux aponta para o 1º nó */
    *elem = aux->info; /* Retorna valor do elemento */

    if(f->ini == f->fim)
        f->fim = NULL;

    f->ini = aux->prox;
    free(aux);
    return 1;
}

void imprime_fila(Fila f)
{
    struct no *aux = f->ini;
    printf("Fila:\n\t{ ");
    while(aux != NULL) {
        printf("%d ", aux->info);
        aux = aux->prox;
    }
    printf("}\n");
}
